"""
@-*- coding: utf-8 -*-
@ python：python 3.8
@ 创建人员:ylx-lingxiao
@ 创建时间:2024/10/29  21:51
@ File:study6.py
@ Explanation:redis数据库
"""
"""
xftp  使用sftp协议
xshell:
点击左上角的文件/新建--
会话的名称可以随便输
ssh协议
主机可以填写公网的IP地址或者你的目标服务器的IP地址
端口号，默认22
其他都是默认

默认在链接菜单，此时输入完信息后，如果需要用户身份验证，则点击用户身份验证
在这里输入用户名和密码  方法选择password
输入完成后，点击确定

此时再次点击左上角新建旁边的连接，这里可以看到你创建的会话，可以选择连接你刚刚的这个会话

如果成功连接，则成功进入服务器

如果你的密码输入错误了，你可以去修改你刚刚的配置，直接去会话，右键属性，可以直接去编辑刚刚的这个会话

xshell连接成功后，上面的A这个可以调整字体的大小

redis是一个非关系型的数据库
优势-性能极高，读写速度快，读的速度110000次/秒    写的速度81000次/秒
redis是装在Linux服务器上的
xshell这个工具就是我们在Windows上远程连接到对应的服务器的工具

uname  可以打印这个服务器的操作系统
在Linux操作系统上搭建redis数据库，怎么搭建不用管，这是运维的事，但是怎么使用你要会

redis.config配置项
redis监听端口默认为6379，再如ssh的默认端口是22 HTTPS 443  http 80
redis数据库没有用户的概念，只有密码，只要你知道密码，你就可以访问，所以一个redis数据库你只需要设置一个密码即可
配置文件中----require空格密码  这个就是你设置的密码

默认的数据库数量16个  和Python一样从0开始 所以是  0-15的数据库编号，可以使用SELECT命令连接上指定的数据库ID

已经进入当前服务器，服务器本机装有redis时  redis-cli --raw -a password   加后面的参数是为了防止中文乱码,一般后面不用跟密码，为了防止密码
泄露，一般你连接本机的或者说你已经远程连接成功的服务器时，进入redis 先需要 redis-cli --raw   然后auth 密码  既可成功登录进入redis
如果你是连接别人服务器上的redis
redis-cli -h host -p port --raw -a password  一般不用这个，因为redis安全做的比较差，一般企业只对内可以访问
后面-a password 的一般不推荐使用，会有暴露密码的风险，都使用先连接 在auth password 的方法进行
redis里边的存储也是按照键值对来存储的

登录redis退出 输入exit

登录Linux服务器后输入 history 可以看到你登录时输入过的相关命令

默认在数据库0，没有任何提示，其他的数据库，可以使用select进行切换 切换成功后前面会显示数据库的数字
进入到某个数据库，这个数据库中是按照键值对的方式来存储的
keys * 展示当前目录下的所有的key  一般不建议使用，如果你不知道到底有多少key的时候，如果有1000000个，那你可能会被卡死
我们推荐用模糊匹配的方式，比如说你知道你要搜索的这个字段是
什么结尾的，
比如v结尾 那么命令就是 keys *v
比如n开头 那么命令就是 keys n*
比如n开头m结尾 那么命令就是 keys n*m
比如n开头m结尾中间有o的 那么命令就是 keys n*o*m
新增键值对  使用 set key value   key不存在则建立，key存在则修改其值
*代表0个或多个任意字符

获取键的总数  dbsize 
获取键值 get key
移动键，跨db去移动，move key dbnum
删除 del key  键如果被删除成功输出1  否则输出0，可以一次性删除多个key 并排去写这个key就可以  返回删除成功的个数
del a b c d   全部删除成功 返回4


查询key的生命周期 秒
ttl key
pttl key  毫秒级别

-1 永不过期
-2 已经过期 此时keys * 已经查询不到了

设置过期时间,成功返回1 此时再去ttl查询就开始倒计时了
expire key seconds  秒级   每次设置就会按照最新的来实现，比如说先100s 都走了20s 了 此时重新设置 100，那么又恢复到100开始重新倒计时
pexpire key nilliseconds   毫秒级

persist key 设置永不过期


set age 18 EX 100
set name manba PX 100000

更改键的名称  值不变
rename name xingming

获取值的长度,获取key对应的值的长度
strlen key

追加内容
append key value
如append name -lijian
返回的是你追加后的一个长度  在原有值后面+，完成后看整个值的长度


清空redis当前 db   只清除你当前在的数据库的  比如说你在8号数据库，那么执行就只删除数据库 8 的
flushdb


redis实际项目使用
1.登录的鉴权和登录的过期-登录成功后，服务器会返回一个token，浏览器会存起来，同时服务器会给redis里也存储一份，为什么用redis存储，因为是有时效性的，我们可以
规定token的过期时间，token 是用来标识用户的身份及登录状态的，登录成功后获取的token相当于后续在一定时间内完成相关业务操作的一个凭证，证明就是这个
用户的操作行为

f12浏览器控制，网络接口请求中可看，看login接口的响应，比如说它的名字就叫admin-token：一串数字，这个login的接口不会带，因为他是登录接口，服务器还没有
返回给它，在这个接口的响应里才会有这个成功的服务器返回的token
后续相关的业务请求，请求头都会带这个admin-token
来完成鉴权
一般来说会往服务器里存储一份
那我们怎么知道存到redis了呢？我们还是先进入对应的服务器的redis，连接成功后  redis-cli --raw 连接
进入后 auth  输入密码
成功进入到 默认数据库 0
keys * 看当前数据库下的键
get 键   可以得到这个键对应的value值，所以我们把token是当键去存的
ttl 键  看这个键的有效时间，秒，过期后，token过期，下一个业务请求接口会提示退出

放redis的原因就是因为它的读写快


对于有效时间的优化
1.第一种就是必须1h 退出，强制退出，高安全性
2.第二种，成功登录后，每次业务请求中带token会刷新过期时间，从新开始计时，直到最后一次业务操作完后，再无相关请求，1h后登录过期，提升易用性




浏览器-携带用户名+密码，请求服务器校验，服务器前往MySQL核对是否正确，校验通过，服务器返回信息，提示登录成功，并返回token，同时
服务器也会给redis里存一份，登录成功的后续，客户端发出的请求都会携带token，到服务器后，服务器会先去rendis看下是否是有效的token，有的话
告诉服务器，合法请求，鉴权通过，可以后续操作，核验不通过，那就告诉服务器，由服务器返回告知重新登录



2.redis缓存机制
一个页面牵扯大量运算，且子运算在一定时间内不会变化，此时考虑redis来缓存一些数据，比如说我们统计昨天的数据，因为昨天的数据在今天看来，是不会变的
什么用什么不用，关键的判断在于，在固定时间内，数据是否会发生变化
目前的策略：每天的第一次访问，会去计算全部的数据，然后返回给你，部分存储进入redis，也就是说当天仅能1个人触发MySQL的查询，剩下的人若要获取对应
的一些数据，那就直接去redis里拿，非常快，但是我们今天缓存的数据，今晚12.00要过期，所以相关的过期时间需要计算，同理类似的数据还有像昨天，上周
上个月，去年这样的数据，我们不用每次都去查而是每天仅第一次的查询去mysql，后续当天要使用这个数据的地方都走redis，类似的维度中像昨天的，我们是每天算一次，去年的
可能我们算了一次后，今年都会一直用这个数据，像上个月的，所以开发的策略又会有所调整，但是总体来说，我们还是使用redis的读写速度快的特点，来做缓存数据
实时会变的或者实时性要求高的，我们每次都查，对这些不会因为时间而变的，我们使用缓存策略，但是要根据具体的需求，来确认redis值的过期时间

浏览器发起请求计算某个数据的结果，服务器响应后去redis先查，看有无符合的值，若有，则返回，若没有，则去MySQL库里查完后返回给服务器，由
服务器返回MySQL的计算结果，并且同时看是否将这个值存一份
到redis的库里



如果开发说他加了redis的缓存机制，你怎么测他是否加了redis缓存机制，或者是否成功加了redis缓存机制，这种测试一般属于功能都测完了，在性能的提升上
开发使用了某种策略，你需要测试他的策略是否成功，是否会对当前的业务有影响


首先保证，比如说昨天的数据，MySQL库里有数据为8，清空今天的redis数据库
第一次，正常发起请求，由于redis没有，则去mysql查，查询成功，返回给客户端，并同步redis
第二次，修改mysql的8为9，此时再去发起查询，看查到的值是多少，如果是8，则证明走了redis
第三次，此时删除redis里的值，客户端发起查询，看查到的是多少，是9，同时去redis里get 这个key 发现值是9，即可
这3步测试完，证明走了redis的缓存机制




3.存储公共数据，比如账号密码
比如大家共用的服务器的账户密码，数据库的账号密码，但凡开发代码中用到的这些数据，不要写死，直接去查redis，让运维把这些数据在redis存一份
开发每次只需要关注，登录redis，get对应的键的值获取账号和密码即可，而运维人员修改后也不会影响原本代码，
因为开发只是get，而运维是set，如果写死了，那么后续运维升级什么或者修改账号密码就会导致一些问题，安全性也不好





                     
"""